shell 特性

命令历史

        敲过的命令,Linux 是会有记录的,预设可以记录1000条历史命令。这些命令保存在用户的家目录中的 .bash-history 文件中。只有当用户正常退出当前的 shell 时,在当前 shell 中运行的命令才会保存至 .bash_history 文件中。

环境变量

  • HISTSIZE:命令历史记录的条数;
  • HISTFILE:~/.bash_history
  • HISTFILESIZE:命令历史文件记录历史的条数
  • HISTTIMEFORMAT:命令的时间戳。这个环境变量需设置,这个功能只能在这个变量被设置之后,那些新执行的 bash 命令才会被打上正确的时间戳。在此之前的所有命令,都将会显示成设置 HISTTIMEFORMAT 变量的时间。

        设置 HISTTIMEFORMAT

1
export HISTTIMEFORMAT='%F %T'

        查看历史命令的时间戳

1
2
3
4
5
history | more
1 2008-08-05 19:02:39 service network restart
2 2008-08-05 19:02:39 exit
3 2008-08-05 19:02:39 id
4 2008-08-05 19:02:39 cat /etc/redhat-release

history 参数

  • history [n] n为数字,列出最近的n条命令
  • -c 将目前shell中的所有history命令消除
  • history [-raw] histfiles
    • -a 将目前新增的命令写入histfiles, 默认写入~/.bash_history
    • -r 将histfiles内容读入到目前shell的history记忆中
    • -w 将目前history记忆的内容写入到histfiles

调用历史中的命令

命令:!!

        两个连续的 “!”,表示执行上一条命令

1
2
3
4
5
[root@localhost ~]# pwd
/root
[root@localhost ~]# !!
pwd
/root

命令:!n

        ”!n”,这里的 n 是数字,表示执行命令历史中第 n 条指令

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# history
.......
1058 vim .bashrc
1059 pwd
1060 history
[root@localhost ~]# !1059
pwd
/root

命令:”!字符串”

        ”!字符串”(字符串大于等于1),以 p 为例,执行命令历史中最近一次 p 开头的命令

1
2
3
[root@localhost ~]# !p
pwd
/root

别名 alias

        别名 alias 也是 bash 所特有的功能之一。可以通过 alias 把一个常用的并且很长的指令别名成简介易记的指令。不想用了还可以用 unalias 解除别名功能。直接敲 alias 会看到目前系统预设的 alias

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

语法

1
alias [命令别名]=['具体的命令']

命令格式

        给命令自定义一个名字,当前 shell 有效

1
2
3
[root@localhost ~]# alias denny='pwd'
[root@localhost ~]# denny
/root

        取消命令别名

1
2
3
[root@localhost ~]# unalias denny
[root@localhost ~]# denny
-bash: denny: command not found

通配符

        “*” 匹配零个或多个字符

1
2
3
4
[root@localhost 111]# ls
1 11.txt 1.txt 22.txt 2.txt 33.txt 3.txt 44.zip 55.zip
[root@localhost 111]# ls *.txt
11.txt 1.txt 22.txt 2.txt 33.txt 3.txt

        “?”匹配一个字符

1
2
3
4
[root@localhost 111]# ls
1 11.txt 1.txt 22.txt 2.txt 33.txt 3.txt 44.zip 55.zip
[root@localhost 111]# ls ?.txt
1.txt 2.txt 3.txt

输入输出重定向(>,>>,<,2>,2>>)

        输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更为常用,经常用于将命令的结果输入到文件中,而不是屏幕上。输入重定向的命令是 <,输出重定向是命令是 >,另外还有追加重定向>>,以及错误重定向2>。

命令:>

        输出重定向,把文件里的内容删掉,写入新的。

1
2
3
4
5
[root@localhost 111]# cat 1.txt
1111
[root@localhost 111]# echo '222'>1.txt
[root@localhost 111]# cat 1.txt
222

命令:>>

        追加重定向,在文件原来的基础上在下面继续写入。

1
2
3
4
[root@localhost 111]# echo '333'>>1.txt
[root@localhost 111]# cat 1.txt
222
333

命令:<

        输入重定向,把文件的内容输入到前面

1
2
[root@localhost 111]# wc -l<1.txt
2

命令:2>,2>>

        错误重定向;追加错误重定向。把错误的内容重定向或追加重定向到文件中去

1
2
3
4
5
6
7
8
[root@localhost 111]# ls 5 2> 1.txt
[root@localhost 111]# cat 1.txt
ls: 无法访问5: 没有那个文件或目录
[root@localhost 111]# ls 5 2>> 1.txt
[root@localhost 111]# cat 1.txt
ls: 无法访问5: 没有那个文件或目录
ls: 无法访问5: 没有那个文件或目录

管道符“|”

        管道符“|”,就是把前面的命令运行的结果丢给后面的命令去处理

1
2
3
4
[root@localhost ~]# cat 1.py|wc -l
6
[root@localhost ~]# cat /etc/passwd|wc -l
21

作业控制

        当运行一个进程时,可以使它暂停(ctrl+z),然后使用fg命令恢复它,利用bg命令使它到后台运行,也可以终止它(ctrl+c)。

        使用 vim 编辑 test1.txt 。随便输入一些内容,按“ESC”后,使用“ctrl+z”使任务暂停

1
2
3
[root@localhost ~]# vim test1.txt
[1]+ 已停止 vim test1.txt

        可以看到提示“vim test1.txt”已停止了,然后使用 fg 命令恢复它,此时就进入刚才的 vim 窗口了。使用“ctrl+c”直接终止 vim 任务。

命令:jobs

        查看暂停的进程

1
2
3
4
5
6
[root@localhost ~]# sleep 100
^Z
[2]+ 已停止 sleep 100
[root@localhost ~]# jobs
[1]- 已停止 vim test1.txt
[2]+ 已停止 sleep 100

命令 fg;fg [编号]

        恢复暂停进程,标号后面带加号的优先恢复,减号其次,也可以恢复指定暂停中的进程

1
2
3
4
5
6
7
8
[root@localhost ~]# jobs
[1]- 已停止 vim test1.txt
[2]+ 已停止 sleep 100
[root@localhost ~]# fg 1
[1]+ 已停止 vim test1.txt
[root@localhost ~]# jobs
[1]+ 已停止 vim test1.txt
[2]- 已停止 sleep 100

命令:bg;bg [编号]

        后台运行暂停的进程,编号后面带加号的有限后台运行,减号其次,也可以指定后台运行暂停中的某个进程,& 表示后台运行

1
2
3
4
5
6
7
8
[root@localhost ~]# jobs
[1]+ 已停止 vim test1.txt
[2]- 已停止 sleep 100
[root@localhost ~]# bg 2
[2]- sleep 100 &
[root@localhost ~]# jobs
[1]+ 已停止 vim test1.txt
[2]- 完成 sleep 100

        丢到后台的任务如何关掉?如果没有退出刚才的 shell 那么先使用 “fg 编号”把任务调到前台,然后使用“ctrl+c”结束任务

命令:ps

        使用 & 把任务丢如后台运行,可以使用 ps aux 命令找到那个进程,结束该进程需要使用 kill 命令

1
2
3
[root@localhost ~]# ps aux|grep vim
root 2307 0.0 0.2 151464 4996 pts/0 T 11:35 0:00 vim test1.txt
root 2349 0.0 0.0 112664 972 pts/0 S+ 12:34 0:00 grep --color=auto vim

命令:kill

        如果关闭当前的 shell ,再次打开另一个 shell 时,使用 jobs 命令并不能显示后台运行或者被暂停的任务,要想停掉它们,则需要先知道起PID,然后使用 kill 命令杀死那个进程

        使用 & 把任务丢到后台运行,会显示 pid 信息。忘记这个 pid 使用 ps aux 命令查找

1
2
3
4
5
[root@localhost ~]# vmstat 1 > /tmp/1.log &
[2] 2351
[root@localhost ~]# ps aux | grep vmstat
root 2351 0.0 0.0 148308 1348 pts/0 S 12:38 0:00 vmstat 1
root 2353 0.0 0.0 112664 972 pts/0 S+ 12:38 0:00 grep --color=auto vmstat

kill 命令语法

        kill 命令语法很简单,直接在后面加上 pid 即可,如果遇到杀不死的进程可以在 kill 后面加一个选项

1
kill -9 [pid]